package server

import (
	. "npxy-go/pkg/proxy"
	. "npxy-go/pkg/proxy/message"
	"npxy-go/pkg/tcp"
)

type portalHandler struct {
	tcp.BaseHandler
	localPort      uint16
	portalSessions *SessionManager
	bridgeSession  *tcp.Session
}

func (p *portalHandler) OnMessage(ctx *tcp.SessionContext, buf *tcp.Buffer) {
	id := p.portalSessions.SessionId(ctx.Session)

	msg := &ForwardMessage{}
	msg.Id = id
	msg.LocalPort = p.localPort
	msg.Encode(buf)

	p.sendToBridge(buf)
}

func (p *portalHandler) OnConnected(ctx *tcp.SessionContext) {
	id := p.portalSessions.Save(ctx.Session)

	buf := tcp.NewBuffer()
	msg := &ConnectionMessage{}
	msg.Id = id
	msg.LocalPort = p.localPort
	msg.Encode(buf)

	p.sendToBridge(buf)
}

func (p *portalHandler) OnDisconnected(ctx *tcp.SessionContext) {
	id := p.portalSessions.SessionId(ctx.Session)

	buf := tcp.NewBuffer()
	msg := &DisconnectionMessage{}
	msg.Id = id
	msg.LocalPort = p.localPort
	msg.Encode(buf)

	p.sendToBridge(buf)
	p.portalSessions.Release(ctx.Session)
}

func (p *portalHandler) sendToBridge(buf *tcp.Buffer) {
	if p.bridgeSession != nil {
		p.bridgeSession.Send(buf)
	}
}
